// // 可以完全按照 JavaScript 标准语法编写代码

// const hello = (name: string) => {
//   console.log(`Hello, ${name}`)
// }

// hello('TypeScript')

// // 原始数据类型

// const a: string = 'foobar'
// const b: number = 100 // NaN Infinity
// const c: boolean = true // false
// const d: string = null  // 非严格模式下string、number、boolean可以是null 或 undefined
// const e: void = undefined // 非严格模式下可以是null 或 undefined
// const f: null = null
// const g: undefined = undefined
// const h: symbol = Symbol() // 配置文件中target 需要再es2015之后  或者配置文件中lib属性配置lib: ["ES2015", "BOM"]

// // TypeScript Object 类型  非原始类型的所有类型：数组、对象、函数
// // const foo: object = function () {}  // [] // {}

// const obj: { foo: number, bar: string } = { foo: 123, bar: 'string' }

// // TypeScript 数组类型
// const arr1: Array<number> = [1, 2, 3]

// const arr2: number[] = [1, 2, 3]

// function sum (...args) {
//   // 判断是不是每个成员都是数字
// }

// // 元组类型

// const tuple: [number, string] = [18, 'age'] // 类型和数量不同都会报错
// // const age = tuple[0]
// // const name = tuple[1]

// // const [age, name] = tuple

// // 枚举类型(Enum)


// // enum PostStatus {
// //   Draft = 0,
// //   Unpublished = 1,
// //   published = 2
// // }

// const enum PostStatus {  // 可以自动累加
//   Draft,
//   Unpublished,
//   published
// }

// const post = {
//   title: 'Hello TypeScript',
//   content: 'TypeScript is a typed superset of JavaScript',
//   status: PostStatus.Draft // 1 // 0
// }

// // 函数类型  输入输出定义类型

// function func1 (a: number, b?: number, ...rest: number[] ): string {  // ?可选参数， 参数可有可无 ...rest 声明任意个数的参数
//   return 'func1'
// }

// func1(100, 200)

// func1(100) // 错误

// func1(100, 200, 300) // 错误

// const func2: (a: number, b:number) => string = function (a: number, b: number): string {
//   return 'func2'
// }

// // 任意类型
// // function stringify(value) {
// //   return JSON.stringify(value)
// // }

// // stringify('string')

// // stringify(100)

// // stringify(true)

// // // let foo: any = 'string'

// // foo = 100

// // foo.bar()

// // 隐式类型推断
// let age = 18 // number

// // age = 'string' 

// let foo

// foo = 100

// foo = 'string'

// // 类型判断
// // 假定这个nums来自一个明确的接口
// const nums = [110, 120, 119, 112]

// const res = nums.find(i => i > 0)
// // const square = res * res

// const num1 = res as number

// const num2 = <number>res // JSX 下不能使用

// 接口
// 
// interface Post {
//   title: string
//   content: string
//   subtitle?: string // 可选
//   readonly summary: string // 只读
// }

// function printPost (post: Post) {
//   console.log(post.title)
//   console.log(post.content)
// }

// printPost({
//   title: 'hello typescript',
//   content: 'A javascripotdjwkllkdjlwk',
//   summary: 'A JavaScript'
// })

// // hello.summary = 'other'

// interface Cache {
//   [prop: string]: string
// }

// const cache: Cache = {}

// cache.foo = 'value1'
// cache.bar = 'value2'

// 类
// class Person {
//   public name: string // = 'init name' // public 共有成员  默认值
//   private age: number  // private 私有属性
//   protected readonly gender: boolean // protected 受保护的  readonly只读
//   constructor (name: string, age: number) {
//     this.name = name
//     this.age = age
//     this.gender = true
//   }

//   sayHi (msg: string):void {
//     console .log(`I am ${this.name}, ${this.age}, ${msg}`)
//   }
// }

// class Student extends Person {
//   private constructor (name: string, age: number) {
//     super(name, age)
//     console.log(this.gender)  // 正确
//   }

//   static create (name: string, age: number) {
//     return new Student(name, age)
//   }
// }

// const tom = new Person('tom', 18)
// console.log(tom.name)
// // console.log(tom.age) // 错误
// // console.log(tom.gender) // 错误

// // const jack = new Student() // private修饰符 不能被访问
// const jack = Student.create('jack', 18) // private修饰符 不能被访问
// // tom.gender = '123' // readonly只读不可被修改

// 类与接口

// interface Eat {
//   eat (food: string): void
// }

// interface Run {
//   run (dispatch: number): void
// }

// class Person implements Eat, Run {
//   eat (food: string): void {
//     console.log(`优雅的进餐：${food}`)
//   }

//   run (distance: number) {
//     console.log(`直立行走：${distance}`)
//   }
// }

// class Animal implements Eat, Run {
//   eat (food: string):void {
//     console.log(`呼噜呼噜的吃：${food}`)
//   }

//   run (distance: number) {
//     console.log(`爬行：${distance}`)
//   }
// }

// 抽象类
// abstract class {
//   eat (food: string):void {
//     console.log(`呼噜呼噜的吃：${food}`)
//   }

//   abstract run (distance: number) {
//     console.log(`爬行：${distance}`)
//   }
// }
